// ProjectName: go -learn-demo
// PackageName: _9_routine
// Description:
// Author: hy.bai
// Date: 2025-07-30 15:18

package main

import (
	"fmt"
	"sync"
	"time"
)

// 1.定义一个全局变量作为计数器。
var wg sync.WaitGroup

// 通过协程调用test函数
func test1() {
	for i := 0; i < 5; i++ {
		fmt.Printf("第%d次打印 - test1函数----Hello Go~~~\n", i+1)
		time.Sleep(100 * time.Microsecond) // 休眠100毫秒
	}
	// 3.当协程值运行完毕，计数器减1
	wg.Done() // 也可以写成：wg.Add(-1)
}

func test2() {
	for i := 0; i < 5; i++ {
		fmt.Printf("第%d次打印 - test2函数----Hello Go~~~\n", i+1)
		time.Sleep(100 * time.Microsecond) // 休眠100毫秒
	}
	// 3.当协程值运行完毕，计数器减1
	wg.Done() // 也可以写成：wg.Add(-1)
}

// main线程打印两次
func main() {
	// 方式1:
	// 2.每开启一个协程,计数器+1
	wg.Add(1)
	go test1() // 开启一个协程调用执行test函数
	// 2.每开启一个协程,计数器+1
	wg.Add(1)
	go test2() // 开启一个协程调用执行test函数

	// 方式2:
	//	wg.Add(2)
	//	go test1() // 开启一个协程调用执行test函数
	//	go test2() // 开启一个协程调用执行test函数

	for i := 0; i < 2; i++ {
		fmt.Printf("第%d次打印 - main函数----Hello Go~~~\n", i+1)
		time.Sleep(100 * time.Microsecond) // 休眠100毫秒
	}

	// 4.阻塞等待，等待计数器归0。
	wg.Wait()
	fmt.Println("main函数结束")
}
